/*
 * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.iec.edp.caf.msu.client.register;

import io.fabric8.kubernetes.api.model.IntOrString;
import io.fabric8.kubernetes.api.model.Service;
import io.fabric8.kubernetes.api.model.ServiceBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.iec.edp.caf.msu.api.ServiceUnitAwareService;
import io.iec.edp.caf.msu.api.client.ServiceRegistry;
import io.iec.edp.caf.msu.api.entity.MsuProperties;
import io.iec.edp.caf.msu.api.entity.ServiceUnitRegisterInfo;
import lombok.extern.slf4j.Slf4j;

import javax.annotation.PreDestroy;
import java.util.Collections;

/**
 * @author Leon Huo
 */
@Slf4j
public class KubernetesRegisterImpl implements ServiceRegistry {

    private MsuProperties configuration;

    private ServiceUnitAwareService suAware;

    public KubernetesRegisterImpl(MsuProperties configuration, ServiceUnitAwareService suAware) {
        this.configuration = configuration;
        this.suAware = suAware;
    }

    /**
     * 应用注册
     *
     * @param serviceUnitRegisterInfo
     * @return
     */
    @Override
    public Boolean register(ServiceUnitRegisterInfo serviceUnitRegisterInfo) {
        throw new RuntimeException("not surpport Kubernetes");
    }

    @Override
    @PreDestroy
    public Boolean unRegister() {
        log.error("Kubernete register start unregist su");
        throw new RuntimeException("not surpport Kubernetes");
    }

    @Override
    public Boolean register(String namespace, ServiceUnitRegisterInfo registerInfo) {
        //k8s客户端
        KubernetesClient client = new DefaultKubernetesClient();
        //遍历su，注册service
        registerInfo.getServiceUnitInfo().forEach(suInfo -> {
            String name = suInfo.getName().toLowerCase();
            Service svc = new ServiceBuilder()
                    .withNewMetadata()
                    .withName(name)
                    .endMetadata()
                    .withNewSpec()
                    .withSelector(Collections.singletonMap("app", name))
                    .addNewPort()
                    .withProtocol("TCP")
                    .withPort(80)
                    .withTargetPort(new IntOrString(9376))
                    .endPort()
                    .withType("LoadBalancer")
                    .endSpec()
                    .build();
            svc = client.services().inNamespace(name).create(svc);
        });


        return null;
    }

//    @Override
//    public Boolean unRegister(String namespace) {
//        return null;
//    }
}
